package com.cy.pj.goods.dao;

import ch.qos.logback.classic.db.names.ColumnName;
import com.cy.GoodsDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//公司域名（com.cy）+项目名（project-pj）+模块（goods）+层（Dao）

/**
 * 此对象为一个商品数据层访问对象，现在要求再此类中定义一个方法，这个方法用于从数据库获取商品信息，
 * 并将其封装到map集合，要求一个行记录一个map对象（key为表中字段名，值为字段名对应的值），多个map存储到li
 *
 * 此注解通常用于描述数据层实现类对象。本质上就是一个特殊的@Component
 *都是要交给spring框架管理的一个Bean对象
 *
 */
@Repository
public class DefaultGoodsDao implements GoodsDao {
    @Autowired
    private DataSource dataSource;
    /** 查询商品信息，一行记录映射为内存中的一个map对象*/
    public List<Map<String,Object>> findGoods(){
        //1.获取链接（从连接池获取）
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        String sql = "select id,name,remark,createdTime from tb_goods";
        try {
           conn = dataSource.getConnection();
            //2.创建statement对象
            stmt = conn.createStatement();
            //3.发送sql
            rs = stmt.executeQuery(sql);
            //4.处理结果
            List<Map<String,Object>> list = new ArrayList<>();
            while (rs.next()){//循环一次取一行
                    list.add(rowMap(rs));//将存储了一行记录的map再存到list中
                 }
                return list;

        }catch ( SQLException e ){
            e.printStackTrace();
            throw  new RuntimeException(e);//转换为非检查异常(编译时不检测的异常)
        }finally {
            //5.释放资源
            close(rs,stmt,conn);
        }

    }

    private Map<String,Object> rowMap(ResultSet rs)throws SQLException {
        Map<String, Object> rowMap = new HashMap<>();
//                rowMap.put("id", rs.getInt("id"));
//                rowMap.put("name", rs.getString("name"));
//                rowMap.put("remark", rs.getString("remark"));
//                rowMap.put("createdTime", rs.getTimestamp("createdTime"));
//                list.add(rowMap);//将存储了一行记录的map对象再存储到list集合
        ResultSetMetaData rsmd = rs.getMetaData();//获取元数据（包括表中的字段名）
        int ColumnCount = rsmd.getColumnCount();//获取列的数量
        for (int i = 0; i < ColumnCount; i++) {
            rowMap.put(rsmd.getColumnLabel(i+1), rs.getObject(rsmd.getColumnLabel(i+1)));
            //getColumnLabel(i+1);获取表中字段名或字段名对应的别名
        }
        return rowMap;
    }

    private void close(ResultSet rs, Statement stmt, Connection conn) {

            if (rs != null)try {
                rs.close();}catch ( Exception e ){ e.printStackTrace(); }
            if (stmt != null)try {
                stmt.close();}catch ( Exception e ){ e.printStackTrace(); }
            //在这里的连接时返回到了池中
            if (conn != null)try {
                conn.close();}catch ( Exception e ){ e.printStackTrace(); }

    }
}
